
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Helper classes that manage scoped state.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef _SCENE_GRAPH_SCOPED_STATE_H_
#define _SCENE_GRAPH_SCOPED_STATE_H_

#include "SceneGraph/Plugins/OpenGL/CompileGuard.h"

#include "Usul/Config/Config.h"

#include "GLee.h"


namespace SceneGraph {
namespace OpenGL {
namespace Scope {


///////////////////////////////////////////////////////////////////////////////
//
//  Push and pop the server-attribute stack.
//
///////////////////////////////////////////////////////////////////////////////

struct ServerAttributes
{
  ServerAttributes ( GLbitfield bits )
  {
    ::glPushAttrib ( bits );
  }
  ~ServerAttributes()
  {
    ::glPopAttrib();
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Push and pop the client-attribute stack.
//
///////////////////////////////////////////////////////////////////////////////

struct ClientAttributes
{
  ClientAttributes ( GLbitfield bits )
  {
    ::glPushClientAttrib ( bits );
  }
  ~ClientAttributes()
  {
    ::glPopClientAttrib();
  }
};


///////////////////////////////////////////////////////////////////////////////
//
//  Calls glBegin() and glEnd()
//
///////////////////////////////////////////////////////////////////////////////

struct BeginEnd
{
  BeginEnd ( GLenum mode )
  {
    ::glBegin ( mode );
  }
  ~BeginEnd()
  {
    ::glEnd();
  }
};


} // namespace Scope
} // namespace OpenGL
} // namespace SceneGraph


#endif // _SCENE_GRAPH_SCOPED_STATE_H_
